package com.bms.client.service.impl;

import com.bms.client.mapper.*;
import com.bms.client.pojo.ChuFangGuanLi;
import com.bms.client.pojo.ChuFangGuanLiGenXing;
import com.bms.client.pojo.ChuFangGuanLiZhengJia;
import com.bms.client.pojo.YiWuRenYuan;
import com.bms.client.service.ChuFangGuanLiService;
import com.bms.client.utils.RedisUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;

/**
 * 出访管理(ChuFangGuanLi)表服务实现类
 *
 * @author makejava
 * @since 2021-03-15 19:46:30
 * @version 1.0
 */
@Service("chuFangGuanLiService")
public class ChuFangGuanLiServiceImpl implements ChuFangGuanLiService {
    @Resource
    private ChuFangGuanLiMapper chuFangGuanLiMapper;
    @Resource
    private HeZuoJiHuaGuanLiMapper heZuoJiHuaGuanLiMapper;
    @Resource
    private FeiYongGuanLiMapper feiYongGuanLiMapper;
    @Resource
    private RedisUtils redisUtils;
    @Resource
    private YiWuRenYuanMapper yiWuRenYuanMapper;
    @Resource
    private KeYanRenYuanMapper keYanRenYuanMapper;
    /**
     * 根据模糊条件查询总个数
     *
     * @return 返回查询到的总个数
     */
	@Override
    public Map<String, Object> chaXunCount(String mingCheng) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.chuFangGuanLiMapper.chaXunCount(mingCheng));
        return map;
    }

    /**
     * 查询所有数据
     * @return  返回所有数据
     */
	@Override
    public Map<String, Object> chaXunAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.chuFangGuanLiMapper.chaXunAll());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
	@Override
    public Map<String, Object> chaXunById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        ChuFangGuanLi chuFangGuanLi = chuFangGuanLiMapper.chaXunById(id);
        List<YiWuRenYuan> list=new ArrayList<>();
        for(String s:chuFangGuanLi.getSuiHangXueSheng().split(",")){
            list.add(yiWuRenYuanMapper.chaXunById(s));
        }
        chuFangGuanLi.setYiWuRenYuans(list);
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("obj", chuFangGuanLi);
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param page 查询起始位置
     * @param chuFangShenQingRen 查询条数
     * @return 对象列表
     */
	@Override
    public Map<String, Object> chaXunFenYe(int page, String chuFangShenQingRen) {
    // 获取当前表中的总记录
        int tableCount = this.chuFangGuanLiMapper.chaXunCount(chuFangShenQingRen);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / 10 + 1;
        // 计算每页开始的下标值
        int xiaBiao = (page - 1) * 10;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.chuFangGuanLiMapper.chaXunFenYe(xiaBiao, chuFangShenQingRen));
        return map;
    }

    /**
     * 新增数据
     *
     * @param chuFangGuanLiZhengJia 实例对象
     * @return 实例对象
     */
	@Override
    @Transactional(rollbackFor = Throwable.class)
    public Map<String, Object> xinZeng(ChuFangGuanLiZhengJia chuFangGuanLiZhengJia) {
        Map<String, Object> map = new HashMap<>();
	    if(chuFangGuanLiZhengJia.getHeZuoJiHuaId()!=-1&&heZuoJiHuaGuanLiMapper.chaXunById(chuFangGuanLiZhengJia.getHeZuoJiHuaId())==null){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "没有关联的合作计划,或您输入的信息有误");
            return map;
        }
	    if(keYanRenYuanMapper.chaXunById(chuFangGuanLiZhengJia.getChuFangRenYuanId())==null){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "该科研人员不存在，增加失败");
            return map;
        }
        ChuFangGuanLi chuFangGuanLi=new ChuFangGuanLi();
        BeanUtils.copyProperties(chuFangGuanLiZhengJia,chuFangGuanLi);
        this.chuFangGuanLiMapper.xinZeng(chuFangGuanLi);

        redis(chuFangGuanLi.getId(),0);

        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "新增成功");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param chuFangGuanLiGenXing 实例对象
     * @return 实例对象
     */
	@Override
    @Transactional(rollbackFor = Throwable.class)
    public Map<String, Object> gengXinById(ChuFangGuanLiGenXing chuFangGuanLiGenXing) {
        Map<String, Object> map = new HashMap<>();
	    if(chuFangGuanLiMapper.chaXunShuLiangById(chuFangGuanLiGenXing.getId())==0){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "该主键不存在,更新失败");
            return map;
        }
	    ChuFangGuanLi chuFangGuanLi=new ChuFangGuanLi();
        BeanUtils.copyProperties(chuFangGuanLiGenXing,chuFangGuanLi);
        this.chuFangGuanLiMapper.gengXinById(chuFangGuanLi);

        redis(chuFangGuanLiGenXing.getId(),1);

        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        return map;
    }
    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
	@Override
    @Transactional(rollbackFor = Throwable.class)
    public Map<String, Object> shanChuById(String id) {
        Map<String, Object> map = new HashMap<>();
        if(chuFangGuanLiMapper.chaXunById(Integer.parseInt(id))==null){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "请勿重复删除");
            return map;
        }
        if(feiYongGuanLiMapper.chaXunById(chuFangGuanLiMapper.chaXunById(Integer.parseInt(id)).getFeiYongId())!=null){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "无法删除一个具有费用的出访记录");
            return map;
        }
        this.chuFangGuanLiMapper.shanChuById(id);
        if(!redisUtils.redisDelete("chuFangGuanLi",id)){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "请勿重复删除");
            return map;
        }
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除成功");
        return map;
    }

    @Override
    @Transactional(rollbackFor = Throwable.class)
    public Map<String, Object> huiGuiById(int id) {
        Map<String, Object> map = new HashMap<>();
	    if(chuFangGuanLiMapper.chaXunShuLiangById(id)==0){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "该id不存在回归失败");
            return map;
        }
        ChuFangGuanLi chuFangGuanLi = chuFangGuanLiMapper.chaXunById(id);
        chuFangGuanLi.setShiJiShiJian(new Date(System.currentTimeMillis()));
        chuFangGuanLiMapper.gengXinById(chuFangGuanLi);

        redis(id,1);

        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "回归成功");
        return map;
    }

    @Override
    public String chaXunChuFangWeiWanCheng() {
	    StringBuilder ChuFangWeiWanCheng= new StringBuilder();
	    for(ChuFangGuanLi chuFangGuanLi:chuFangGuanLiMapper.chaXunChuFangWeiWanCheng()){
            ChuFangWeiWanCheng.append(",").append(chuFangGuanLi.getId());
        }
        return ChuFangWeiWanCheng.toString().replaceFirst(",","");
    }
    @Override
    public void redis(int id,int stat){
            ChuFangGuanLi chuFangGuanLi1 = (ChuFangGuanLi)chaXunById(id).get("obj");
            if(chuFangGuanLi1!=null){
                Map<String, String> conditionalQueue=new HashMap<>();
                conditionalQueue.put("chuFangShenQingRen",chuFangGuanLi1.getKeYanRenYuan().getMingCheng());
                conditionalQueue.put("chuFangRen",chuFangGuanLi1.getChuFangShenQingRen());
                if(stat==0){
                    redisUtils.redisInsert("chuFangGuanLi",conditionalQueue,String.valueOf(id),chuFangGuanLi1);
                }
                if(stat==1){
                    redisUtils.redisUpData("chuFangGuanLi",conditionalQueue,String.valueOf(id),chuFangGuanLi1);
                }
            }

    }
}